/*
 *线程管理
 * 1、join() 用于等待线程完成执行。如果不调用 join() 或 detach() 而直接销毁线程对象，会导致程序崩溃。
 * 2、detach() 用于将线程与主线程分离，使线程在后台独立运行。分离的线程不会阻塞主线程的执行，但需要注意线程的生命周期，
 *      避免主线程结束前线程还在运行。
 * */
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
void func(int num, string str)
{
    for (int i = 0; i < 10; ++i)
    {
        cout << "子线程: i = " << i << "num: "
             << num << ", str: " << str << endl;
    }
}
void func1()
{
    for (int i = 0; i < 10; ++i)
    {
        cout << "子线程: i = " << i << endl;
    }
}
int main()
{
    /*
     * 应用程序启动之后默认只有一个线程，这个线程一般称之为主线程或父线程，通过线程类创建出的线程一般称之为子线程，
     * 每个被创建出的线程实例都对应一个线程ID，这个ID是唯一的，可以通过这个ID来区分和识别各个已经存在的线程实例，
     * 这个获取线程ID的函数叫做get_id()，函数原型如下：
     * std::thread::id get_id() const noexcept;
     * */
    cout << "主线程的线程ID: " << this_thread::get_id() << endl;
    thread t(func, 520, "i love you");// 创建线程t。线程执行func函数，并传递参数520和"i love you"
    thread t1(func1);// 创建线程t1。线程执行func1函数
    cout << "线程t 的线程ID: " << t.get_id() << endl;
    cout << "线程t1的线程ID: " << t1.get_id() << endl;
    // 等待子线程执行完
    t.join();
    t1.join();
    //join()	主线程等待子线程执行完成后再继续执行，安全可靠，常用
    //detach()	子线程独立运行，主线程不等它，适合后台任务，但必须自己管理生命周期
    /*
     * 主线程的线程ID: 103532
        线程t 的线程ID: 546240
        线程t1的线程ID: 542808
        子线程: i = 0num: 520, str: i love you
        子线程: i = 1num: 520, str: i love you
        子线程: i = 2num: 520, str: i love you
        子线程: i = 3num: 520, str: i love you
        子线程: i = 4num: 520, str: i love you
        子线程: i = 5num: 520, str: i love you
        子线程: i = 6num: 520, str: i love you
        子线程: i = 7num: 520, str: i love you
        子线程: i = 8num: 520, str: i love you
        子线程: i = 9num: 520, str: i love you
        子线程: i = 0
        子线程: i = 1
        子线程: i = 2
        子线程: i = 3
        子线程: i = 4
        子线程: i = 5
        子线程: i = 6
        子线程: i = 7
        子线程: i = 8
        子线程: i = 9
     * */
    return 0;
}